package com.cskaoyan.javase.oop2._1extends._7initialization._1notice;

/**
 * 子类对象初始化时的细节问题：
 *      1.子类对象在初始化时会去调用父类的构造方法，如果子类构造器第一行什么都不写
 *      会隐含super;去调用父类的无参构造器
 *      所以默认情况下，父类中必须得有无参构造器
 *      如果父类中没有无参构造，那么子类的构造器必须明确的调用父类的有参构造，否则会编译报错。
 *      之前我们推荐大家在写类时，顺手给出无参构造，主要有两个原因：
 *          a.子类对象的隐式初始化依赖于父类的无参构造
 *          b.某些框架创建对象会依赖于无参构造
 *
 *      2.子类对象初始化时虽然会调用父类构造器，但是没有创建父类对象。
 *          构造器不是用来创建对象的，而是在创建对象过程中给成员变量赋值的。
 *
 *      3.this在表示调用自身构造器时，必须在构造器的第一行
 *      super在表示调用父类构造器时，也必须在构造器的第一行
 *      所以this和super在表示调用构造器时是不能共存的。
 *      原因是：构造器的首行如果没有明确调用别的构造器就会隐含super();
 *      如果允许this和super在表示调用构造器时不在第一行，会导致重复调用父类构造器，会出错。
 *
 *      4.如果子类构造器中有this跳转自身构造器，最终肯定也会有一个构造器能够跳到父类构造器
 *      构造器执行的先父后子
 *      是一定的
 *
 * @since 14:26
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Son s = new Son(10, 20);
    }
}

class Father {
    int a;

    public Father(int a) {
        super();
        this.a = a;
    }

    public Father() {
    }
}

class Son extends Father {

    int b = 10;
    int c = 20;

    public Son(int b) {
        // super();
        // this(1,2);
        this.b = b;
    }

    public Son(int b, int c) {
        //super();
        this(b);
        this.c = c;
    }

    public Son(int a, int b, int c) {
        // super();
        super(a);
        this.b = b;
        this.c = c;
    }
}